﻿using System;

namespace VirtualAndNewApp
{
    class Enemy
    {
        public void Move()
        {
            Console.WriteLine("调用了 Enemy 的 Move 方法");
        }

        public virtual void Attack()
        {
            Console.WriteLine("Enemy Attack");
        }
    }

    class Boss : Enemy
    {
        public override void Attack()
        {
            Console.WriteLine("Boss Attack");
        }

        public new void Move()
        {
            Console.WriteLine("Boss move");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 隐藏方法的调用
            Boss oneEnemy = new Boss();
            oneEnemy.Move(); // 调用的是隐藏方法，用子类的声明来调用的，调用的就是子类的 Move

            Enemy twoEnemy = new Boss();
            twoEnemy.Move(); // 调用的隐藏方法，用父类的声明来调用的，调用的就是父类的 Move 方法

            // 虚方法的调用
            // 用什么类型来构造，在调用方法的时候就会调用什么类型的方法
            Enemy threeEnemy = new Enemy();
            threeEnemy.Attack(); // 调用虚方法，用父类来实例化的，所以调用的是父类的 Attack 方法

            Enemy fourEnemy = new Boss();
            fourEnemy.Attack(); // 调用虚方法，用子类实例化的，所以调用的是子类（Boss）的 Attack 方法
            Console.ReadKey();
        }
    }
}

/*

虚方法的调用：调用上，使用子类构造的对象调用虚方法，就会调用子类的方法，使用父类构造的对象，就会调用父类的方法。

隐藏方法的调用：调用上， 使用子类类型的声明调用隐藏方法，就会调用到子类的方法。若想调用被隐藏的方法，需要用父类类型的声明来调用。 

 */